[アップデート]AWS SAM CLIがAWS環境上のAWS Step Functionsを実行できるようになりました
初めに
本日AWS SAM CLIのv1.102.0
がリリースされました。
今回のアップデートでsam remote invoke
を経由してSAMでデプロイした実際のAWS環境上のStep Functionsを実行できるようになりました。
これまでStep FunctionsはAWS::Serverless::StateMachineとしてSAM専用の拡張要素は存在するもののremote invoke
(リモート実行)やlocal invoke
(ローカル実行)に対応していないため、テストするためにはAWS APIやマネジメントコンソールなど別ツールからの操作が必要となっておりました。
現在もまだローカル実行には対応していませんがリモート実行ができるようになったことでよりSAMでの開発が行いやすくなります。
一応ローカルの実行はSAM単体では実現できませんがStep Functions LocalやAWS CLIといった別サービスを組み合わせることで実現可能です(従来より)。
今回はremote invokeの
追加ですのでそちらの方を試してみます。
セットアップ
sam init
でサンプルのプロジェクトを生成します。
テンプレート選択時に4
を選択することでStep Functionsが初期で設定されているテンプレートを利用可能です(11もおそらく該当)。
% sam init You can preselect a particular runtime or package type when using the `sam init` experience. Call `sam init --help` to learn more. Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 Choose an AWS Quick Start application template 1 - Hello World Example 2 - Data processing 3 - Hello World Example with Powertools for AWS Lambda 4 - Multi-step workflow 5 - Scheduled task 6 - Standalone function 7 - Serverless API 8 - Infrastructure event management 9 - Lambda Response Streaming 10 - Serverless Connector Hello World Example 11 - Multi-step workflow with Connectors 12 - Full Stack 13 - Lambda EFS example 14 - DynamoDB Example 15 - Machine Learning Template: 4
今までStateMachineやStep Functionsのような単語でイメージしていたので完全に存在を見落としていました。
コードは以下となりますが、ざっくりDynamoDBを作成して簡単な在庫処理をするようなものとなるようです。
デプロイしたものをビジュアルエディタで見るとわかりやすいですね。
こちらのスタックをsam deploy
でデプロイしておきます。
マネジメントコンソールから実行
デフォルトの動きをイメージするためにまずはマネジメントコンソールから実行します。
入力値は利用しないので適当な値で問題ありません。
実行すると乱数でstock_price
の値が決まり、その値に応じでDynamoDBに書き込みに行く処理となります。
DynamoDB側のテーブルを確認します。
SAMからの実行
せっかくなので引数を受け取るようなパターンを見ておきたいのと乱数だと実行確認がわかりづらいのでShack Stock Value
で実行する関数はStockPrice
を受け取り固定値で処理できるようにしておきます。
from random import randint def lambda_handler(event, context): ... # Check current price of the stock # 変更前 # stock_price = randint(0, 100) # Current stock price is mocked as a random integer between 0 and 100 stock_price = event['StockPrice'] if 'StockPrice' in event else randint(0, 100) return {"stock_price": stock_price}
sam build && sam deploy
実行後sam remote invoke
を実行します。
実行にはStep Functions用のオプションが存在するわけではなくLambda関数同様のコマンドで実行できます。
今回はテンプレート上にremote invoke
で実行可能なリソースが複数あるので実行するリソース名の指定、前述の引数で受け取る仕組みの追加を行っている関係でその指定を行いますが、ステートマシン単体であればsam remote invoke
のみで問題ありません。
# 実行可能なLambda関数、Step Functionsが複数存在するためエラー # これはStep Functionsが存在するからではなく従来でもLambda関数が複数存在すれば発生する $ sam remote invoke Error: sam-app-sfn contains more than one resource that could be used with remote invoke, please provide resource_id argument to resolve ambiguity. $ sam remote invoke StockTradingStateMachine -e '{"StockPrice": 101}' Invoking Step Function StockTradingStateMachine {"SdkHttpMetadata":{"AllHttpHeaders":{"Server":["Server"],"Connection":["keep-alive"],"x-amzn-RequestId":["xxxxxx"],"x-amz-crc32":["2745614147"],"Content-Length":["2"],"Date":["Wed, 15 Nov 2023 02:56:29 GMT"],"Content-Type":["application/x-amz-json-1.0"]},"HttpHeaders":{"Connection":"keep-alive","Content-Length":"2","Content-Type":"application/x-amz-json-1.0","Date":"Wed, 15 Nov 2023 02:56:29 GMT","Server":"Server","x-amz-crc32":"2745614147","x-amzn-RequestId":"xxxxxx"},"HttpStatusCode":200},"SdkResponseMetadata":{"RequestId":"xxxxxx"}}%
元々処理されるコードとしてはPriceの値がランダムに0~100の間で生成されますが今回はその値を超える101を指定しており、その値が設定されているため渡されたイベント値で処理されていることも確認できました。
sam remote invoke
自体の出力はステートマシン側の出力の値となっているようです。Step Functions自体あまり使ったことないのですぐにできなかったのですが定義を調整すれば直前の結果を最終の出力部分にも渡したりできるのでしょうか?
終わりに
リモート上のみとはなりますがStep Functionsが実行できるようになったことでよりSAMでの開発がしやすくなりました。
実はStep Functionsあまり使ったことないのでこの機会に色々試してみようかなと思っています。
実はこのアップデートv1.91.0
の時点のアップデートの内容に含まれていたのですがユーザ側に機能が解放されていない状態でした。
(マネジメントコンソールの実行はその当時に先走って実行した為DynamoDBに格納されている日付が2023/7/19とやや古めのものになってます)
しばらく間が空いてしまったので凍結されたかどうかが若干心配でしたが無事リリースされて良かったです。